package Daos;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Timestamp;
import java.util.Calendar;
import logica.jugadores.Turno;
import excepciones.PersistenciaException;

/**
 * 
 * @author GRUPODOS
 * @category dao que accede a los datos de los turnos en base de datos
 */
public class Turnos 
{
	/**
	 * ingresa un turno a la tabla turnos de la base de datos y retorna  el id recien generado
	 * @param t la transaccion
	 * @param turno el turno a ingresar
	 * @return el id recien generado
	 * @throws PersistenciaException si ocurre error SQL
	 */
  public int insertarTurno(Connection t, Turno turno)
  throws PersistenciaException
  {
	  int resu = 0;
		try {
			ConsultasSQL consultas = new ConsultasSQL();

			String query = consultas.insertarTurno();
			PreparedStatement pstmt = t.prepareStatement(query, Statement.RETURN_GENERATED_KEYS);
			java.util.Date date= new java.util.Date();
			 
			pstmt.setInt(1,0);
			pstmt.setInt(2, turno.getMovrestantes());
			pstmt.setTimestamp(3, new Timestamp(date.getTime()));
			pstmt.setBoolean(4, false);
			
			pstmt.executeUpdate();

			ResultSet rs = pstmt.getGeneratedKeys();
			if (rs.next())
				resu = rs.getInt(1);
			rs.close();
			pstmt.close();

		} catch (SQLException e) {
			throw new PersistenciaException(
					"Ocurrio un error en el acceso a la BD al insertar");
		}
	  return resu;
  }
  /**
   * busca un turno dado un id
   * @param t la transaccion
   * @param id el id del turno a buscar
   * @return el turno si existe, null si no
   * @throws PersistenciaException si ocurre error SQL
   */
  public Turno buscarTurnoPorId(Connection t, int idTurno)
  throws PersistenciaException
  {
	  Turno resu = null;
	  try {
			ConsultasSQL Consulta = new ConsultasSQL();
			String query = Consulta.buscarTurnoPorId();
			PreparedStatement pstmt = t.prepareStatement(query);
			pstmt.setInt(1, idTurno);

			ResultSet rs = pstmt.executeQuery();
			if (rs.next()) {
				//Convierto de timestap a calendar
				Timestamp ts = rs.getTimestamp("comienzo");
				int movRest = rs.getInt("movRestantes");
				boolean activo = false;
				if(rs.getInt("activo") == 1)
				{
					activo = true;
				}
				Calendar cal = Calendar.getInstance();
				cal.setTimeInMillis(ts.getTime());
				resu=new Turno(movRest, cal);
				resu.setIdTurno(idTurno);
				resu.setTurnoActivo(activo);
			}
			rs.close();
			pstmt.close();

		} catch (SQLException e) {
			throw new PersistenciaException(
					"Ocurrio un error en el acceso a la BD al acceder a los datos");
		}
	  return resu;
  }
  /**
   * metodo que actualiza el comienzo del turno cuyo id se ingresa
   * @param t la transaccion
   * @param idTurno el identificador del turno a actualizar
   * @throws PersistenciaException si ocurre error SQL
   */
public void actualizarComienzoTurno(Connection t,int idTurno ) 
throws PersistenciaException
{
	
	ConsultasSQL consultas = new ConsultasSQL();
	String sql = consultas.actualizarComienzoTurno();

	try {
		PreparedStatement ps = t.prepareStatement(sql);
			
		Calendar fecha = Calendar.getInstance();
		ps.setDate(1, new java.sql.Date(fecha.getTime().getTime()));
		ps.setInt(2,idTurno);
		//Ejectuo el statement
		ps.executeUpdate();
		
		ps.close();
		
	} catch (SQLException e) {
		throw new PersistenciaException(e.getMessage());
	} 
}
/**
 * actualiza la cantidad de movimientos que le quedan al turno cuyo id se ingresa
 * @param t la transaccion
 * @param idTurno el identificador del turno
 * @param cantMovimientos la cantidad de movimientos que le quedan
 * @throws PersistenciaException si ocurre error SQL
 */
public void actualizarMovimientosRestantesTurno(Connection t,int idTurno ,int cantMovimientos) 
throws PersistenciaException
{
	ConsultasSQL consultas = new ConsultasSQL();
	String sql = consultas.actualizarMovimientosRestantesTurno();

	try {
		PreparedStatement ps = t.prepareStatement(sql);
			
		ps.setInt(1,cantMovimientos);
		ps.setInt(2,idTurno);
		//Ejectuo el statement
		ps.executeUpdate();
		
		ps.close();
	} catch (SQLException e) {
		throw new PersistenciaException(e.getMessage());
	} 
	
}
/**
 * actualiza el turno y lo vuelve activo o inactivo
 * @param t la transaccion
 * @param idTurno el identificador del turno
 * @param activo booleano si es activo o no
 * @throws PersistenciaException si ocurre error SQL
 */
public void actualizarActivoTurno(Connection t,int idTurno ,boolean activo) 
throws PersistenciaException
{
	ConsultasSQL consultas = new ConsultasSQL();
	String sql = consultas.actualizarActivoTurno();
	int turnoActivo = 1;
	try {
		PreparedStatement ps = t.prepareStatement(sql);
		if(activo == false)
		{
			turnoActivo = 0;
		}	
		ps.setInt(1,turnoActivo);
		ps.setInt(2,idTurno);
		//Ejectuo el statement
		ps.executeUpdate();
		
		ps.close();
	} catch (SQLException e) {
		throw new PersistenciaException(e.getMessage());
	} 	
}
}
